<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>数据类型</title>
</head>
<body>
<script>
    /*
    * 1.js数据类型
    *   1.基本数据类型
    *       String 字符串
    *       Number 数字
    *       Boolean 布尔值
    *       null 空
    *       undefined 未定义
    *       symbol 唯一值
    *       bigInt 大数字
    *
    *   2.引用(对象)数据类型
    *       Object 基类
    *           {} plainObject
    *           Array
    *           Function
    *           Date
    *           RegExp
    * */
    console.dir(Array);

    //常见的数据类型判断
    // 1. typeof 一般用来判断基本数据类型 不能判断引用数据类型 会之间返回小写的字符串数据类型
    //    特殊 typeof null ===> "object"

    //         计算机语言  ===> 010101010000101010101111
    //         基础  ===> 汇编语言  编译语言(翻译)
    //             c++ 所有的数据类型都是用二机制语言表示和存储的
    //                 数据类型->整数:1
    //                 数据类型->字符串:100
    //                 数据类型->布尔值:101
    //                 数据类型->对象:000
    //                 数据类型->undefined:-2^30
    //                 数据类型->null:000000

                // 当使用typeof判断数据类型的时候 会只取前三位
    //         高级  ===> javascript  <==>  C++



    // 2. instanceof  语法:  (要判断的数据类型) instanceof [Array/Object/Function]
    // 3. constructor 构造函数  要判断的数据类型.constructor === Array
    // 4. Object.prototype.toString.call(要判断的数据类型)  返回值 "[object 数据类型]"
    // 5. $.type(要判断的数据类型) 最全的数据类型判断 ==> "string" "number" "object"

    //isNaN isArray原生自带的  isObject isFunction isString

    //手动写一下isObject isFunction

    //手动实现一个完整的$.type
    function getType(data){
        let typeStr = Object.prototype.toString.call(data)
        return typeStr.replace('/\[object (\S+)\]/', '$1')
    }





    //bigInt 大数字
    // console.log(Number.MAX_SAFE_INTEGER); //最大安全数字
    // console.log(Number.MIN_SAFE_INTEGER); //最小安全数字
    //typeof 9007199254740991n  //bigint
    //9007199254740991n+1n ==> 9007199254740992n


    // // symbol
    // console.log("AA" === "AA");
    // console.log(Symbol("AA") === Symbol("AA"));//false
    // console.log(typeof Symbol("AA"));
    // console.dir(Boolean);
    // console.dir(Symbol);
    // console.dir(Array);
    //
    // // Symbol.for ==> for of底层处理方法
    // // Symbol.iterator ==> 迭代器
    // let obj = {
    //     name: "haha",
    //     // [Symbol("age")]: 18,
    //     // [Symbol("age")]: 90,
    //     age:19,
    //     age:80,
    //     [Symbol("age")]: 18,
    //     [Symbol("age")]: 90,
    // }
    // console.log(obj);

    //for in 和 for of的区别
    //遍历对象
    // let obj = {
    //     name: "haha",
    //     age: 18
    // }
    // for(let key in obj){
    //     console.log("for in",key,obj[key])
    // }
    // for(let key of obj){//error: obj is not iterable 迭代器
    //     console.log("for of",key,obj[key])
    // }
    //遍历数组
    // let arr = [1,2,3,3];
    // for(let index in arr){
    //     console.log("for in",index,arr[index])
    // }
    // for(let item of arr){//arr is iterable 迭代器
    //     console.log("for of",item)
    // }



</script>

</body>
</html>